module enqueueMuxer32 (
    input wire clk,
    input wire rst,
    input wire enqueue_sucess,
    input wire queue_en_1,
    input wire queue_en_2,
    input wire queue_en_3,
    input wire queue_en_4,
    input wire queue_en_5,
    input wire queue_en_6,
    input wire queue_en_7,
    input wire queue_en_8,
    input wire queue_en_9,
    input wire queue_en_10,
    input wire queue_en_11,
    input wire queue_en_12,
    input wire queue_en_13,
    input wire queue_en_14,
    input wire queue_en_15,
    input wire queue_en_16,
    input wire queue_en_17,
    input wire queue_en_18,
    input wire queue_en_19,
    input wire queue_en_20,
    input wire queue_en_21,
    input wire queue_en_22,
    input wire queue_en_23,
    input wire queue_en_24,
    input wire queue_en_25,
    input wire queue_en_26,
    input wire queue_en_27,
    input wire queue_en_28,
    input wire queue_en_29,
    input wire queue_en_30,
    input wire queue_en_31,
    input wire queue_en_32,
    input wire [5:0] enqueue_priority_1,
    input wire [5:0] enqueue_priority_2,
    input wire [5:0] enqueue_priority_3,
    input wire [5:0] enqueue_priority_4,
    input wire [5:0] enqueue_priority_5,
    input wire [5:0] enqueue_priority_6,
    input wire [5:0] enqueue_priority_7,
    input wire [5:0] enqueue_priority_8,
    input wire [5:0] enqueue_priority_9,
    input wire [5:0] enqueue_priority_10,
    input wire [5:0] enqueue_priority_11,
    input wire [5:0] enqueue_priority_12,
    input wire [5:0] enqueue_priority_13,
    input wire [5:0] enqueue_priority_14,
    input wire [5:0] enqueue_priority_15,
    input wire [5:0] enqueue_priority_16,
    input wire [5:0] enqueue_priority_17,
    input wire [5:0] enqueue_priority_18,
    input wire [5:0] enqueue_priority_19,
    input wire [5:0] enqueue_priority_20,
    input wire [5:0] enqueue_priority_21,
    input wire [5:0] enqueue_priority_22,
    input wire [5:0] enqueue_priority_23,
    input wire [5:0] enqueue_priority_24,
    input wire [5:0] enqueue_priority_25,
    input wire [5:0] enqueue_priority_26,
    input wire [5:0] enqueue_priority_27,
    input wire [5:0] enqueue_priority_28,
    input wire [5:0] enqueue_priority_29,
    input wire [5:0] enqueue_priority_30,
    input wire [5:0] enqueue_priority_31,
    input wire [5:0] enqueue_priority_32,
    input wire [9:0] enqueue_index_1,
    input wire [9:0] enqueue_index_2,
    input wire [9:0] enqueue_index_3,
    input wire [9:0] enqueue_index_4,
    input wire [9:0] enqueue_index_5,
    input wire [9:0] enqueue_index_6,
    input wire [9:0] enqueue_index_7,
    input wire [9:0] enqueue_index_8,
    input wire [9:0] enqueue_index_9,
    input wire [9:0] enqueue_index_10,
    input wire [9:0] enqueue_index_11,
    input wire [9:0] enqueue_index_12,
    input wire [9:0] enqueue_index_13,
    input wire [9:0] enqueue_index_14,
    input wire [9:0] enqueue_index_15,
    input wire [9:0] enqueue_index_16,
    input wire [9:0] enqueue_index_17,
    input wire [9:0] enqueue_index_18,
    input wire [9:0] enqueue_index_19,
    input wire [9:0] enqueue_index_20,
    input wire [9:0] enqueue_index_21,
    input wire [9:0] enqueue_index_22,
    input wire [9:0] enqueue_index_23,
    input wire [9:0] enqueue_index_24,
    input wire [9:0] enqueue_index_25,
    input wire [9:0] enqueue_index_26,
    input wire [9:0] enqueue_index_27,
    input wire [9:0] enqueue_index_28,
    input wire [9:0] enqueue_index_29,
    input wire [9:0] enqueue_index_30,
    input wire [9:0] enqueue_index_31,
    input wire [9:0] enqueue_index_32,
    output reg [31:0] enqueue_en_for_queue,
    output reg enqueue_out,
    output reg [5:0] enqueue_priority_out,
    output reg [15:0] enqueue_value_out
);
    wire [7:0] arbitration_group [0:3];
    wire [3:0] enqueue_part;
    wire [5:0] enqueue_priority [0:3];
    wire [9:0] enqueue_index [0:3];
    wire [5:0] enqueue_where [0:3];
    reg delay;

    wire [3:0] final_arbitration;

    always @(posedge clk) begin
        if (rst) begin
            enqueue_out <= 1'b0;
            enqueue_priority_out <= 0;
            delay <= 0;
        end

        if (enqueue_sucess || delay) begin
            enqueue_out <= 1'b0;
            enqueue_priority_out <= 0;
            //再往后打一拍
            if (delay == 1'b0) begin
                delay <= 1;
            end
            else begin
                delay <= 0;
            end
        end
        else begin
            if (final_arbitration == 4'b0001) begin
                enqueue_out <= 1'b1;
                enqueue_priority_out <= enqueue_priority[0];
                enqueue_value_out <= (enqueue_where[0] << 10) + enqueue_index[0];
            end

            if (final_arbitration == 4'b0010) begin
                enqueue_out <= 1'b1;
                enqueue_priority_out <= enqueue_priority[1];
                enqueue_value_out <= ((enqueue_where[1]+8) << 10) + enqueue_index[1];
            end

            if (final_arbitration == 4'b0100) begin
                enqueue_out <= 1'b1;
                enqueue_priority_out <= enqueue_priority[2];
                enqueue_value_out <= ((enqueue_where[2]+16) << 10) + enqueue_index[2];
            end

            if (final_arbitration == 4'b1000) begin
                enqueue_out <= 1'b1;
                enqueue_priority_out <= enqueue_priority[3];
                enqueue_value_out <= ((enqueue_where[3]+24) << 10) + enqueue_index[3];
            end

            if (final_arbitration == 4'b0000) begin
                enqueue_out <= 1'b0;
            end
        end
    end

    //定义仲裁选择器，作用是从32个信号里选中最紧急一组信号入队
    enqueueMuxer8 muxer1(.clk(clk), .rst(rst), .queue_en_1(queue_en_1), .enqueue_priority_1(enqueue_priority_1), .enqueue_index_1(enqueue_index_1),
                        .queue_en_2(queue_en_2), .enqueue_priority_2(enqueue_priority_2), .enqueue_index_2(enqueue_index_2),
                        .queue_en_3(queue_en_3), .enqueue_priority_3(enqueue_priority_3), .enqueue_index_3(enqueue_index_3),
                        .queue_en_4(queue_en_4), .enqueue_priority_4(enqueue_priority_4), .enqueue_index_4(enqueue_index_4),
                        .queue_en_5(queue_en_5), .enqueue_priority_5(enqueue_priority_5), .enqueue_index_5(enqueue_index_5),
                        .queue_en_6(queue_en_6), .enqueue_priority_6(enqueue_priority_6), .enqueue_index_6(enqueue_index_6),
                        .queue_en_7(queue_en_7), .enqueue_priority_7(enqueue_priority_7), .enqueue_index_7(enqueue_index_7),
                        .queue_en_8(queue_en_8), .enqueue_priority_8(enqueue_priority_8), .enqueue_index_8(enqueue_index_8),
                        .enqueue_arbitration(arbitration_group[0]), .enqueue_out(enqueue_part[0]), .enqueue_priority_out(enqueue_priority[0]), .enqueue_index_out(enqueue_index[0]), .enqueue_where_out(enqueue_where[0]));

    enqueueMuxer8 muxer2(.clk(clk), .rst(rst), .queue_en_1(queue_en_9), .enqueue_priority_1(enqueue_priority_9), .enqueue_index_1(enqueue_index_9),
                        .queue_en_2(queue_en_10), .enqueue_priority_2(enqueue_priority_10), .enqueue_index_2(enqueue_index_10),
                        .queue_en_3(queue_en_11), .enqueue_priority_3(enqueue_priority_11), .enqueue_index_3(enqueue_index_11),
                        .queue_en_4(queue_en_12), .enqueue_priority_4(enqueue_priority_12), .enqueue_index_4(enqueue_index_12),
                        .queue_en_5(queue_en_13), .enqueue_priority_5(enqueue_priority_13), .enqueue_index_5(enqueue_index_13),
                        .queue_en_6(queue_en_14), .enqueue_priority_6(enqueue_priority_14), .enqueue_index_6(enqueue_index_14),
                        .queue_en_7(queue_en_15), .enqueue_priority_7(enqueue_priority_15), .enqueue_index_7(enqueue_index_15),
                        .queue_en_8(queue_en_16), .enqueue_priority_8(enqueue_priority_16), .enqueue_index_8(enqueue_index_16),
                        .enqueue_arbitration(arbitration_group[1]), .enqueue_out(enqueue_part[1]), .enqueue_priority_out(enqueue_priority[1]), .enqueue_index_out(enqueue_index[1]), .enqueue_where_out(enqueue_where[1]));
                        
    enqueueMuxer8 muxer3(.clk(clk), .rst(rst), .queue_en_1(queue_en_17), .enqueue_priority_1(enqueue_priority_17), .enqueue_index_1(enqueue_index_17),
                        .queue_en_2(queue_en_18), .enqueue_priority_2(enqueue_priority_18), .enqueue_index_2(enqueue_index_18),
                        .queue_en_3(queue_en_19), .enqueue_priority_3(enqueue_priority_19), .enqueue_index_3(enqueue_index_19),
                        .queue_en_4(queue_en_20), .enqueue_priority_4(enqueue_priority_20), .enqueue_index_4(enqueue_index_20),
                        .queue_en_5(queue_en_21), .enqueue_priority_5(enqueue_priority_21), .enqueue_index_5(enqueue_index_21),
                        .queue_en_6(queue_en_22), .enqueue_priority_6(enqueue_priority_22), .enqueue_index_6(enqueue_index_22),
                        .queue_en_7(queue_en_23), .enqueue_priority_7(enqueue_priority_23), .enqueue_index_7(enqueue_index_23),
                        .queue_en_8(queue_en_24), .enqueue_priority_8(enqueue_priority_24), .enqueue_index_8(enqueue_index_24),
                        .enqueue_arbitration(arbitration_group[2]), .enqueue_out(enqueue_part[2]), .enqueue_priority_out(enqueue_priority[2]), .enqueue_index_out(enqueue_index[2]), .enqueue_where_out(enqueue_where[2]));

    enqueueMuxer8 muxer4(.clk(clk), .rst(rst), .queue_en_1(queue_en_25), .enqueue_priority_1(enqueue_priority_25), .enqueue_index_1(enqueue_index_25),
                        .queue_en_2(queue_en_26), .enqueue_priority_2(enqueue_priority_26), .enqueue_index_2(enqueue_index_26),
                        .queue_en_3(queue_en_27), .enqueue_priority_3(enqueue_priority_27), .enqueue_index_3(enqueue_index_27),
                        .queue_en_4(queue_en_28), .enqueue_priority_4(enqueue_priority_28), .enqueue_index_4(enqueue_index_28),
                        .queue_en_5(queue_en_29), .enqueue_priority_5(enqueue_priority_29), .enqueue_index_5(enqueue_index_29),
                        .queue_en_6(queue_en_30), .enqueue_priority_6(enqueue_priority_30), .enqueue_index_6(enqueue_index_30),
                        .queue_en_7(queue_en_31), .enqueue_priority_7(enqueue_priority_31), .enqueue_index_7(enqueue_index_31),
                        .queue_en_8(queue_en_32), .enqueue_priority_8(enqueue_priority_32), .enqueue_index_8(enqueue_index_32),
                        .enqueue_arbitration(arbitration_group[3]), .enqueue_out(enqueue_part[3]), .enqueue_priority_out(enqueue_priority[3]), .enqueue_index_out(enqueue_index[3]), .enqueue_where_out(enqueue_where[3]));    

    //第二层的四选一仲裁器
    enqueueArbiter4 arb(.queue_en_1(enqueue_part[0]), .data_priority_1(enqueue_priority[0]), 
                        .queue_en_2(enqueue_part[1]), .data_priority_2(enqueue_priority[1]), 
                        .queue_en_3(enqueue_part[2]), .data_priority_3(enqueue_priority[2]), 
                        .queue_en_4(enqueue_part[3]), .data_priority_4(enqueue_priority[3]), .enqueue_arbitration(final_arbitration));
endmodule